「AWSとGitHubで始めるDevOpsハンズオン」の資料を公開します!
はじめに
こんにちは、中山です。
弊社はGitHubと国内初のサービスパートナー契約を結びました。そこで、ソースコード共有サービスとしてデファクトスタンダードとなっているGitHubと、クラウド業界で高いシェアを誇っているAWSを組み合わせて、継続的インテグレーション/継続的デリバリーを構築するハンズオンを実施します。すでに募集ページも公開しているので是非お越しください。まずは大阪から、次に東京で開催します。
本エントリではハンズオンで利用する資料を事前に公開します。どういった内容を実施するのかぜひご覧になってください。
ハンズオンでは弊社エンジニアが各種サービスの説明をしながらステップバイステップで進めていきますので、「まだ触ったことがないけどついていけるかな」といった不安感があっても大丈夫です。ぜひ参加してGitHub/AWSの知識を持ち帰っていただければと思います。
「もうすでに触ったことあるよ」といった方には、弊社の豊富なAWS構築事例で得られた知見をご紹介したいと思いますので、より深い知識を得られるともいます。突っ込んだご質問も募集中です!
手順
ハンズオンは以下の手順で進めていきます。本エントリでは簡略的な説明になっていますが、会場では一つ一つ説明しながら進めていきます。
- 1. リポジトリのフォーク
- 2. キーペアの作成
- 3. CloudFormationスタックの作成
- 4. IAM Roleの作成
- 5. パイプラインの作成
- 6. buildspec.ymlの作成
- 7. appspec.ymlの作成
- 8. リポジトリへのプッシュ
- 9. パイプラインの動作確認
- 10. 追加の問題
- 補足. ハンズオン環境の掃除
最終的に以下のような構成を作成します。
1. リポジトリのフォーク
今回のハンズオンで利用するサンプルアプリケーションを自分のGitHubアカウントに事前にフォークしておきましょう。アプリケーションはExpressで作成した簡単なWebアプリケーションです。
まず、以下のリンクを開いてください。
- knakayama/aws-github-devops-hands-on-sample-app
-
画面右上にある「Fork」ボタンをクリックすると以下のようにフォークが始まります
後ほどソースコードを修正するので、ローカルにクローンしておきましょう。以下のコマンドをターミナルソフトウェア上で実行してください。 <_YOUR_GITHUB_NAME_>
は自分のGitHubアカウント名に置き換えてください。
$ git clone https://github.com/<_YOUR_GITHUB_NAME_>/aws-github-devops-hands-on-sample-app.git
ls
コマンドなどで正常にクローンが実行されたことを確認してください。
$ cd aws-github-devops-hands-on-sample-app $ ls app.js bin package.json public routes views
2. キーペアの作成
インスタンスにSSHでログインするためにキーペアを事前に作成しておきます。今回のハンズオンではインスタンスにSSHでログインしない想定ですが、デバッグ用途などで用意しておくと便利です。すでに作成している場合この作業は必要ありません。
- マネジメントコンソールのトップ画面より「EC2」をクリック
- 「EC2ダッシュボード」から「キーペア」をクリック
- 「キーペアの作成」をクリックしてキーペア名をわかりやすい名前(hands-onなど)で入力
- 「作成」をクリックするとキーペアのダウンロード画面が表示されるので、任意の場所に保存
3. CloudFormationスタックの作成
本ハンズオンではオートスケーリンググループ内のインスタンスに対してアプリケーションをデプロイしていきます。一からマネジメントコンソールで作成すると大変なので、CloudFormationのテンプレートでサクっと作成しましょう。このテンプレートでは以下のスタックを作成します。
以下のリンクをクリックするとスタックの作成画面が表示されます。スタック名をわかりやすい名前(hands-on-stackなど)にし、事前に作成したキーペアをパラメータのプルダウンメニューから選択してください。
スタックの作成後、CloudFromationの「出力」で表示されるロードバランサ(ELB)のFQDNにアクセスして以下のような画面が表示されることを確認してください。
4. IAM Roleの作成
CodeDeployのセットアップをする際に必要になるので、事前にIAM Roleを作成しておきましょう。
- マネジメントコンソールのトップ画面から「IAM」をクリック
- IAMダッシュボードより「ロール」をクリック
- 「新しいロールの作成」をクリック
- 「AWS サービスロール」から「AWS CodeDeploy」を選択してクリック
- 「ポリシー名」に「AWSCodeDeployRole」という名前のポリシーが表示されるので、チェックボックスにチェックを入れて「次のステップ」をクリック
- 最後に確認画面が表示されるので、「ロール名」にわかりやすい名前(hands-on-codedeploy-roleなど)を入力して、「ロールの作成」をクリック
すると、「ロール」の画面から先程作成したロールが表示されます。
5. パイプラインの作成
ハンズオンで利用する主要なサービスのCodePipeline/CodeBuild/CodeDeployを利用したパイプラインを作成していきます。もちろん、1つずつ作成することも可能ですが、CodePipelineの画面からいっぺんに作成すると簡単です。
- マネジメントコンソールのトップ画面より「CodePipeline」をクリック
- まだパイプラインを作成していない場合は以下のような画面が表示されるので「今すぐ始める」をクリック
- パイプラインのセットアップが開始するのでパイプライン名をわかりやすい名前(hands-on-pipelineなど)で入力して「次のステップ」をクリック
- ソースプロバイダのセットアップが始まるので以下の表のように入力後、「次のステップ」をクリック
入力項目 | 値 |
---|---|
ソースプロバイダ | GitHub |
リポジトリ | フォークしておいたリポジトリ |
ブランチ | master |
- ビルドプロバイダのセットアップが始まるので以下の表のように入力後、「ビルドプロジェクトの保存」をクリックしてから「次のステップ」をクリック
入力項目 | 値 |
---|---|
ビルドプロバイダ | AWS CodeBuild |
プロジェクトの設定 | 新しいビルドプロジェクトを作成 |
プロジェクト名 | わかりやすい名前(hands-on-projectなど) |
環境イメージ | AWS CodeBuild マネージド型イメージの使用 |
OS | Ubuntu |
ランタイム | Node.js |
バージョン | aws/codebuild/nodejs:6.3.1 |
ビルド仕様 | ソースコードのルートディレクトリの buildspec.yml を使用 |
CodeBuild サービスロール | アカウントで新しいロールを作成します |
VPC | No VPC |
- デプロイプロバイダのセットアップが始まるのでプロバイダに「AWS CodeDeploy」を入力後、「AWS CodeDeploy に新たにアプリケーションを作成します。」のリンクをクリック
- すると、CodeDeployの作成画面が表示されるので以下の表のように入力後、「アプリケーションの作成」をクリック
入力項目 | 値 |
---|---|
アプリケーション名 | わかりやすい名前(hands-on-appなど) |
デプロイグループ名 | わかりやすい名前(hands-on-groupなど) |
デプロイタイプ | Blue/Greenデプロイ |
環境設定 | Auto Scaling グループの自動コピー |
Auto Scaling グループ | CloudFormationで作成したオートスケーリンググループ |
ロードバランサ | CloudFormationで作成したロードバランサ |
元のインスタンス | デプロイの成功後にデプロイグループの置き換え元インスタンスを終了 0 日 0 時間 0 分 |
サービスロール | 事前に作成したCodeDeploy用ロール |
- デプロイプロバイダのセットアップ画面で作成したCodeDeployの設定が反映されるので、以下のように入力後「次のステップ」をクリック
- CodePipelineにアタッチするIAM Roleの画面に変わるので、「ロールの作成」をクリック後、遷移する画面で「許可」をクリック
- IAM Roleの作成が完了したら「次のステップ」をクリック
- 最後に確認画面が表示されるので、内容を確認後、「パイプラインの作成」をクリック
すると、パイプラインが自動で開始されます。が、この時点では必要な設定が完了していないため以下のように失敗してしまいます。次のステップで作成していきましょう。
6. buildspec.ymlの作成
CodeBuildの設定ファイルである buildspec.yml
を用意します。エディタを開いて以下の内容でリポジトリのトップディレクトリに保存してください。
buildspec.yml
version: 0.2 phases: install: commands: - | npm install pre_build: commands: - | npm test build: commands: - | echo 'no build' artifacts: files: - "**/*"
7. appspec.ymlの作成
続いてCodeDeployの設定ファイルである appspec.yml
と各種Hookスクリプトを用意します。先程と同じように以下の内容でファイルを保存してください。
appspec.yml
version: 0.0 os: linux files: - source: / destination: /usr/src/app hooks: BeforeInstall: - location: hooks/before_install.sh timeout: 300 runas: root ApplicationStart: - location: hooks/application_start.sh timeout: 300 runas: root ValidateService: - location: hooks/validate_service.sh timeout: 300 runas: root
hooks/before_install.sh
#!/usr/bin/env bash app_src_path="/usr/src/app" app_log_path="/var/log/app" mkdir "$app_src_path" "$app_log_path"
hooks/application_start.sh
#!/usr/bin/env bash app_path="/usr/src/app/bin/www" forever_log="/var/log/app/forever.log" app_access_log="/var/log/app/access.log" app_error_log="/var/log/app/error.log" forever start \ -l "$forever_log" \ -o "$app_access_log" \ -e "$app_error_log" \ "$app_path"
hooks/validate_service.sh
#!/usr/bin/env bash curl http://localhost:3000/
8. リポジトリへのプッシュ
各設定ファイルの準備ができたらフォークしたリポジトリへプッシュしましょう。以下のコマンドを実行してください。
# ステージングへの追加 $ git add . # コミット $ git commit -m 'add buildspec.yml & appspec.yml' # プッシュ $ git push origin master
9. パイプラインの動作確認
GitHubリポジトリへのプッシュを契機にパイプラインが実行されます。最後にパイプラインが正常に動作するか確認しましょう。最終的に以下の画像のように全てのステージで「成功」と表示されたらOKです。
CodeBuild/CodeDeployの画面からより詳細な結果を確認できます。
- CodeBuild
- CodeDeploy
http://<ELBのFQDN>/express/
にアクセスするとExpressで作成したWebアプリケーションが表示されます。
10. 追加の問題
時間が余ったら以下の問題をやってみましょう。こちらは一度自分でどうやって設定するのか考えて実施してみてください。後ほど答え合わせをやります。
- CodeDeployの設定を変更してみる
- 旧インスタンスを削除するのではなく一定期間残したい場合は?
- CodeBuildを深く理解する
- 独自の環境変数を設定するには?
- ※ ヒント: MY_KEYにMY_VARを設定する
- デプロイ前に承認ステージを追加してみる
- CodePipelineで承認処理を実行させるためには?
- ※ ヒント: 事前にSNSトピックを作成しメールアドレスをサブスクライブしておく
- ソースコードを修正してみる
master
ブランチからトピックブランチを作成する- 先程設定したCodeBuildの環境変数をWebページに表示するには?
- ※ ヒント:
views/index.pug
に以下を追記(pの前はスペース2つ) - echo " p MY_KEY is $MY_KEY" >> views/index.pug
master
ブランチにプルリクエストを出してみる- プルリクエストを
master
ブランチにマージしてみる
補足. ハンズオン環境の掃除
ハンズオンで作成した環境を削除したい場合は以下の手順を参考にしてください。環境を削除する際には順番が重要です。CloudFormationで作成したものと手動で作成したものが相互に参照しているからです。以下の順番で削除していきます。
- CodePipelineの削除
- CodeBuildの削除
- CodeDeployの削除
- 以下3つのIAM Role削除
- CodePipeline用
- CodeBuild用
- CodeDeploy用
- CodePipelineのアーティファクト保存用S3バケット削除
- ※ 他のパイプラインでも利用している場合があるので注意
- CodeDeployが自動で作成したオートスケーリンググループの削除
- CloudFormationスタックの削除
- キーペアの削除(必要であれば)